home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung / Power-Programmierung (Tewi)(1994).iso / magazine / nan_news / toolkit / elapsed.prg < prev    next >
Text File  |  1991-08-15  |  5KB  |  130 lines

  1. /*
  2.  * File......: ELAPSED.PRG
  3.  * Author....: Jo W. French dba Practical Computing
  4.  * Date......: $Date:   15 Aug 1991 23:05:44  $
  5.  * Revision..: $Revision:   1.2  $
  6.  * Log file..: $Logfile:   E:/nanfor/src/elapsed.prv  $
  7.  * 
  8.  * The functions contained herein are the original work of Jo W. French
  9.  * and are placed in the public domain.
  10.  *
  11.  * Modification history:
  12.  * ---------------------
  13.  *
  14.  * $Log:   E:/nanfor/src/elapsed.prv  $
  15.  * 
  16.  *    Rev 1.2   15 Aug 1991 23:05:44   GLENN
  17.  * Forest Belt proofread/edited/cleaned up doc
  18.  * 
  19.  *    Rev 1.1   14 Jun 1991 19:51:46   GLENN
  20.  * Minor edit to file header
  21.  * 
  22.  *    Rev 1.0   01 Apr 1991 01:01:18   GLENN
  23.  * Nanforum Toolkit
  24.  *
  25.  */
  26.  
  27. #ifdef FT_TEST
  28.  
  29.   FUNCTION DEMO()
  30.   LOCAL dStart, dEnd, cTimeStart, cTimeEnd, n, aDataTest := {}
  31.   dStart := CTOD('11/28/90')
  32.   dEnd   := CTOD('11/30/90')
  33.   cTimeStart := "08:00:00"
  34.   cTimeEnd   := "12:10:30"
  35.  
  36.   aDataTest := FT_ELAPSED(dStart,dEnd,cTimeStart,cTimeEnd)
  37.   FOR n = 1 to 4
  38.     ? aDataTest[n,1], STR(aDataTest[n,2], 12, 4)
  39.     ?? " "
  40.     ?? IF(n == 1, 'Days', IF( n== 2, 'Hours', IF( n == 3, 'Mins.', 'Secs.')))
  41.   NEXT
  42.   RETURN NIL
  43.  
  44. #endif
  45.  
  46. /*  $DOC$
  47.  *  $FUNCNAME$
  48.  *     FT_ELAPSED()
  49.  *  $CATEGORY$
  50.  *     Date/Time
  51.  *  $ONELINER$
  52.  *     Return elapsed time between two days and/or times
  53.  *  $SYNTAX$
  54.  *     FT_ELAPSED([ <dStart> ], [ <dEnd> ], ;
  55.  *                <cTimeStart>, <cTimeEnd>) -> aTimedata
  56.  *  $ARGUMENTS$
  57.  *     <dStart> is any valid date in any date format. Defaults to DATE().
  58.  *
  59.  *     <dEnd> is any valid date in any date format. Defaults to DATE().
  60.  *
  61.  *     <cTimeStart> is a valid Time string of the format 'hh:mm:ss' where
  62.  *     hh is hours in 24-hour format.
  63.  *
  64.  *     <cTimeEnd> is a valid Time string of the format 'hh:mm:ss' where
  65.  *     hh is hours in 24-hour format.
  66.  *  $RETURNS$
  67.  *     A two-dimensional array containing elapsed time data.
  68.  *  $DESCRIPTION$
  69.  *     FT_ELAPSED() calculates the elapsed time between two Date/Time events.
  70.  *
  71.  *     It returns an array which contains the following data:
  72.  *
  73.  *     aRetVal[1,1]  Integer Days      aRetVal[1,2] Total Days    (nn.nnnn)
  74.  *     aRetVal[2,1]  Integer Hours     aRetVal[2,2] Total Hours   (nn.nnnn)
  75.  *     aRetVal[3,1]  Integer Minutes   aRetVal[3,2] Total Minutes (nn.nnnn)
  76.  *     aRetVal[4,1]  Integer Seconds   aRetVal[4,2] Total Seconds (nn)
  77.  *  $EXAMPLES$
  78.  *     FT_ELAPSED(CTOD('11/28/90'), CTOD('11/30/90'), '08:00:00', '12:10:30')
  79.  *     will return:
  80.  *
  81.  *     aRetVal[1,1] ->  2 (Days)        aRetVal[1,2] ->    2.1740  Days
  82.  *     aRetVal[2,1] ->  4 (Hours)       aRetVal[2,2] ->   52.1750  Hours
  83.  *     aRetVal[3,1] -> 10 (Minutes)     aRetVal[3,2] -> 3130.5000  Minutes
  84.  *     aRetVal[4,1] -> 30 (Seconds)     aRetVal[4,2] -> 187830     Seconds
  85.  *  $END$
  86.  */
  87.  
  88. FUNCTION FT_ELAPSED(dStart, dEnd, cTimeStart, cTimeEnd)
  89.   LOCAL nTotalSec, nCtr, nConstant, nTemp, aRetVal[4,2]
  90.  
  91.   IF dStart == NIL .OR. !VALTYPE(dStart) $ 'DC'
  92.      dStart := DATE()
  93.   ELSEIF VALTYPE(dStart) == 'C'
  94.      cTimeStart := dStart
  95.      dStart     := DATE()
  96.   ENDIF
  97.  
  98.   IF dEnd == NIL .OR. !VALTYPE(dEnd) $ 'DC'
  99.      dEnd := DATE()
  100.   ELSEIF VALTYPE(dEnd) == 'C'
  101.      cTimeEnd := dEnd
  102.      dEnd     := DATE()
  103.   ENDIF
  104.  
  105.   cTimeStart := IF(cTimeStart == NIL .OR. VALTYPE(cTimeStart) != 'C', ;
  106.                     '00:00:00', cTimeStart)
  107.   cTimeEnd   := IF(cTimeEnd == NIL .OR. VALTYPE(cTimeEnd) != 'C', ;
  108.                     '00:00:00', cTimeEnd)
  109.  
  110.   nTotalSec  := (dEnd - dStart) * 86400                              + ;
  111.                 VAL(cTimeEnd)   *  3600                              + ;
  112.                 VAL(SUBSTR(cTimeEnd,AT(':', cTimeEnd)+1,2)) * 60     + ;
  113.                 IF(RAT(':', cTimeEnd) == AT(':', cTimeEnd), 0,         ;
  114.                 VAL(SUBSTR(cTimeEnd,RAT(':', cTimeEnd)+1)))          - ;
  115.                 VAL(cTimeStart) * 3600                               - ;
  116.                 VAL(SUBSTR(cTimeStart,AT(':', cTimeStart)+1,2)) * 60 - ;
  117.                 IF(RAT(':', cTimeStart) == AT(':', cTimeStart), 0,     ;
  118.                 VAL(SUBSTR(cTimeStart,RAT(':', cTimeStart)+1)))
  119.  
  120.   nTemp := nTotalSec
  121.  
  122.   FOR nCtr = 1 to 4
  123.      nConstant := IF(nCtr == 1, 86400, IF(nCtr == 2, 3600, IF( nCtr == 3, 60, 1)))
  124.      aRetVal[nCtr,1] := INT(nTemp/nConstant)
  125.      aRetval[nCtr,2] := nTotalSec / nConstant
  126.      nTemp -= aRetVal[nCtr,1] * nConstant
  127.   NEXT
  128.  
  129. RETURN aRetVal
  130.